package com.douma._2022_6_25;

import java.util.Scanner;

/**
 * 抖码算法，让算法学习变的简单有趣
 *
 * @作者 : 老汤
 */
public class 欢乐的周末 {

    private static int[][] geo;
    private static int m;
    private static int n;
    private static boolean[][][] visited;
    // 上下左右
    private static int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

    private static int res = 0;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        m = sc.nextInt();
        n = sc.nextInt();
        sc.nextLine();

        geo = new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                geo[i][j] = sc.nextInt();
            }
        }
        // 因为有 2 个人，每个人都要走一遍所有的元素
        // 所以每个人都要设置一个 visited 数组
        visited = new boolean[2][m][n];

        // num 表示谁，如果是 0 的话，表示第一个人，1 的话表示第二个人
        int num = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (geo[i][j] == 2) {
                    // 可能是小华或者小为，那么寻找
                    dfs(i, j, num++);
                }
            }
        }

        System.out.println(res);

        sc.close();
    }

    private static void dfs(int row, int col, int num) {
        if (!inArea(row, col)  // 出界了
                || geo[row][col] == 1 // 遇到障碍物了
                || visited[num][row][col]) { // 已经被访问过了
            return;
        }

        visited[num][row][col] = true;
        // 如果当前元素就是聚餐地点，并且第一个人已经访问过了这个聚餐地点，现在是第二个人访问这个聚餐地点
        // 所以，这个聚餐地点两个人都可以到达
        if (geo[row][col] == 3  // 当前地点是聚餐地点
                && visited[0][row][col]  // 第一个人已经访问过这个聚餐地点
                && num == 1) {  // 现在是第二个人访问这个聚餐地点
            res++;
        }

        for (int[] dir : directions) {
            int nextRow = row + dir[0];
            int nextCol = col + dir[1];
            dfs(nextRow, nextCol, num);
        }

    }

    private static boolean inArea(int row, int col) {
        return row >= 0 && row < m && col >= 0 && col < n;
    }
}
